package stack;

import list.*;

/**
 * StackLista.java
 * @author Oscar Castañeda 11086 Sección 20
 * @since 11/08/2012
 * @lastmodified 13/08/2012
 * @version 1
 * @param <E> Tipo de objetos que almacenará la implementación de pila.
 * Descripción: Implementación de la interfaz pila usando una Lista.
 *               El primer elemento de la Lista es la cima de la pila.
 */

public class  StackLista<E> extends AbstractStack <E>{
    
    /**
     * Lista sobre el cual se implementará el Stack (pila).
     */
    private Lista<E> pila;
    
    /**
     * Construye una nueva pila implementada con una Lista.
     * Pre-Condiciones: No hay.
     * Post-Condiciones: Se ha creado una pila nueva y vacía.
     */
    public StackLista(){
        ListFactory listFactory = new ListFactory<>();
        pila = listFactory.getList();
    }
    
    /**
     * Permite añadir un objeto a la pila, colocándolo en su cima.
     * Pre-Condiciones: La pila debe estar creada.
     * Post-Condiciones: Se almacena el objeto en la cima de la pila.
     * @param item Objeto a añadir en la cima de la pila.
     */
    
    @Override
    public void push(E item) {
        pila.addFirst(item);
    }

    /**
     * Permite extraer el objeto en la cima de la pila.
     * Pre-condiciones: La pila no debe de estar vacía.
     * Post-Condiciones: El objeto que ocupaba la cima ha sido removido y 
     *                   devuelto.
     * @return Objeto en la cima de la pila.
     */
    @Override
    public E pop() {
        return (E) pila.removeFirst();
    }

    /**
     * Regresa el objeto en la cima de la pila sin removerlo.
     * Pre-condiciones: La pila no está vacía.
     * Post-condiciones: El objeto que estaba en la cima de la pila ha sido
     *                   devuelto.
     * @return Objeto en la cima de la pila.
     */
    @Override
    public E peek() {
        return (E) pila.getFirst();
    }

    /**
     * Devuelve el tamaño actual de la pila.
     * Pre-Condiciones: Debe existir una instancia de la pila.
     * Post-Condiciones: Se devuelve el número de elementos almacenados en la pila.
     * @return int Número de elementos que contiene la pila.
     */
    @Override
    public int size() {
        return pila.size();
    }
    
    /**
     * Devuelve si la pila esta vacía o no.
     * Pre-Condiciones: Debe existir una instancia de la pila.
     * Post-Condiciones: Se devuelve si la pila está vacía (true) o no (false)
     * @return boolean true si la pila está vacía; false en caso contrario.
     */
    @Override
    public boolean empty() {
        return pila.isEmpty();
    }
    
}
